/**
 * 描述：文件操作工具
 * 包名：org.file.pom.version
 * 文件名：FileUtil.java
 * 作者：eddy
 * 日期：2017年4月14日-下午8:51:56
 * 
 */
package org.file.pom.version;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/** 
 * 文件操作工具
 * <pre> 
 * 构建组：e-pom
 * 作者：eddy
 * 邮箱：xqxyxchy@126.com
 * 日期：2017年4月14日-下午8:51:56
 * </pre>
 */
public class FileUtil {
	public static final String ANY = "*";
	
	/**
	 * 写入文件.(以默认UTF-8方式)
	 * 
	 * @param fileName
	 *            文件名称
	 * @param content
	 *            文件内容
	 */
	public static void writeFile(String fileName, String content) {
		writeFile(fileName, content, StringUtil.UTF_8);
	}

	/**
	 * 指定字符集，写入文件。
	 * 
	 * @param fileName
	 *            文件名称
	 * @param content
	 * @param charset
	 */
	public static void writeFile(String fileName, String content, String charset) {
		Writer out = null;
		try {
			createFolder(fileName, true);
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), charset));
			out.write(content);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 写入文件
	 * 
	 * @param fileName
	 * @param is
	 * @throws IOException
	 */
	public static void writeFile(String fileName, InputStream is) throws IOException {
		FileOutputStream fos = new FileOutputStream(fileName);
		byte[] bs = new byte[512];
		int n = 0;
		while ((n = is.read(bs)) != -1) {
			fos.write(bs, 0, n);
		}
		is.close();
		fos.close();
	}
	
	/**
	 * 创建文件夹
	 * 
	 * @param path
	 * @param isFile
	 */
	public static void createFolder(String path, boolean isFile) {
		if (isFile)
			path = path.substring(0, path.lastIndexOf(File.separator));
		File file = new File(path);
		if (!file.exists())
			file.mkdirs();
	}
	
	public static List<File> list(String path){
		return list(path, ANY);
	}
	
	public static List<File> list(String path, final String fileName){
		return list(path, fileName, -1);
	}
	
	public static List<File> list(String path, final String fileName, int level){
		if(level == 0){
			return null;
		}
		
		if(StringUtil.isBlank(path)){
			return null;
		}
		
		File parent = new File(path);
		if(!parent.exists()){
			return null;
		}
		
		if(parent.isFile()){
			return null;
		}
		
		List<File> rsList = new ArrayList<File>();
		List<File> _rsList = null;
		File[] rsFiles = null;
		if(ANY.equals(fileName)){
			rsFiles = parent.listFiles();
			if(BeanUtil.isNotEmpty(rsFiles)){
				for(File file : rsFiles){
					if(file.isFile()){
						rsList.add(file);
					}else{
						_rsList = list(file.getAbsolutePath(), fileName, level - 1);
						if(BeanUtil.isNotEmpty(_rsList)){
							rsList.addAll(_rsList);
						}
					}
				}
			}
		}else{
			rsFiles = parent.listFiles(new FileFilter() {
				public boolean accept(File pathname) {
					return pathname.isFile() && pathname.getName().equalsIgnoreCase(fileName);
				}
			});
			if(BeanUtil.isNotEmpty(rsFiles)){
				rsList.addAll(Arrays.asList(rsFiles));
			}
			
			File[] _rsFiles = parent.listFiles(new FileFilter() {
				public boolean accept(File pathname) {
					return pathname.isDirectory();
				}
			});
			if(BeanUtil.isNotEmpty(_rsFiles)){
				for(File file : _rsFiles){
					_rsList = list(file.getAbsolutePath(), fileName, level - 1);
					if(BeanUtil.isNotEmpty(_rsList)){
						rsList.addAll(_rsList);
					}
				}
			}
		}
		
		return rsList;
	}
	
	public static void console(List<File> files){
		if(BeanUtil.isNotEmpty(files)){
			for(File file : files){
				System.out.println("match file:" + file.getPath());
			}
			System.out.println("files.size() is " + files.size());
		}
	}
	
	public static void console(File file){
		if(BeanUtil.isNotEmpty(file)){
			System.out.println("match file:" + file.getPath());
		}
	}
	
}
